import type { KnowledgeDetail } from '@/types/knowledge';

/**
 * 事务与锁知识点数据
 */
export const transactionKnowledge: KnowledgeDetail[] = [
	{
		id: 1,
		title: '事务基础',
		description: '事务是一组SQL语句的集合，要么全部执行成功，要么全部回滚，保证数据一致性。',
		icon: '🔒',
		categoryId: 'sql-transaction',
		categoryName: '事务与锁',
		categoryIcon: '🔒',
		difficulty: '高级',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #e74c3c 0%, #c0392b 100%)',
		keyPoints: [
			{
				point: '事务的ACID特性：原子性（Atomicity）、一致性（Consistency）、隔离性（Isolation）、持久性（Durability）。',
				code: `-- ACID特性：
-- Atomicity（原子性）：事务中的操作要么全部成功，要么全部失败
-- Consistency（一致性）：事务执行前后数据库保持一致状态
-- Isolation（隔离性）：并发事务之间相互隔离
-- Durability（持久性）：事务提交后，数据永久保存

-- 事务示例
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  -- 全部成功或全部回滚`
			},
			{
				point: '事务的开始、提交和回滚：BEGIN/START TRANSACTION、COMMIT、ROLLBACK。',
				code: `-- MySQL事务
START TRANSACTION;
-- 或
BEGIN;

UPDATE users SET status = 'active' WHERE id = 1;
UPDATE orders SET status = 'completed' WHERE user_id = 1;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

-- PostgreSQL事务
BEGIN;
UPDATE users SET status = 'active' WHERE id = 1;
COMMIT;
-- 或
ROLLBACK;`
			},
			{
				point: '自动提交模式：默认情况下，每条SQL语句都是一个事务。',
				code: `-- 查看自动提交模式
SHOW VARIABLES LIKE 'autocommit';  -- MySQL
SHOW autocommit;  -- PostgreSQL

-- 关闭自动提交
SET autocommit = 0;  -- MySQL
SET autocommit = OFF;  -- PostgreSQL

-- 此时需要手动COMMIT或ROLLBACK
INSERT INTO users (name) VALUES ('John');
COMMIT;  -- 必须手动提交

-- 重新开启自动提交
SET autocommit = 1;`
			},
			{
				point: '保存点（Savepoint）：可以在事务中设置保存点，实现部分回滚。',
				code: `-- 使用保存点
BEGIN;
INSERT INTO users (name) VALUES ('User1');
SAVEPOINT sp1;
INSERT INTO users (name) VALUES ('User2');
SAVEPOINT sp2;
INSERT INTO users (name) VALUES ('User3');

-- 回滚到sp2
ROLLBACK TO sp2;  -- User3被回滚，User1和User2保留

-- 回滚到sp1
ROLLBACK TO sp1;  -- User2和User3被回滚，User1保留

-- 释放保存点
RELEASE SAVEPOINT sp1;`
			},
			{
				point: '事务的嵌套：某些数据库支持嵌套事务，但通常不推荐。',
				code: `-- 嵌套事务（某些数据库支持）
BEGIN;  -- 外层事务
    INSERT INTO users (name) VALUES ('User1');
    BEGIN;  -- 内层事务
        INSERT INTO users (name) VALUES ('User2');
    COMMIT;  -- 提交内层事务
COMMIT;  -- 提交外层事务

-- 注意：嵌套事务的行为因数据库而异，通常不推荐使用`
			}
		]
	},
	{
		id: 2,
		title: '事务隔离级别',
		description: '事务隔离级别定义了事务之间的可见性和并发控制规则。',
		icon: '🔐',
		categoryId: 'sql-transaction',
		categoryName: '事务与锁',
		categoryIcon: '🔒',
		difficulty: '高级',
		color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
		headerBg: 'linear-gradient(135deg, #2c3e50 0%, #34495e 100%)',
		tagBg: 'linear-gradient(135deg, #3498db 0%, #2980b9 100%)',
		tagColor: '#ffffff',
		difficultyBg: 'linear-gradient(135deg, #e74c3c 0%, #c0392b 100%)',
		keyPoints: [
			{
				point: '四种隔离级别：READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。',
				code: `-- 查看当前隔离级别
SELECT @@transaction_isolation;  -- MySQL 8.0+
SELECT @@tx_isolation;  -- MySQL 5.7

-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 隔离级别从低到高：
-- READ UNCOMMITTED < READ COMMITTED < REPEATABLE READ < SERIALIZABLE`
			},
			{
				point: 'READ UNCOMMITTED：允许读取未提交的数据，可能出现脏读。',
				code: `-- 脏读示例：
-- 事务A：修改数据但未提交
BEGIN;
UPDATE users SET balance = 1000 WHERE id = 1;
-- 未提交

-- 事务B：读取未提交的数据（脏读）
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT balance FROM users WHERE id = 1;  -- 可能读到1000

-- 如果事务A回滚，事务B读到的就是脏数据
-- 通常不推荐使用此隔离级别`
			},
			{
				point: 'READ COMMITTED：只读取已提交的数据，避免脏读，但可能出现不可重复读。',
				code: `-- 不可重复读示例：
-- 事务A：第一次读取
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM users WHERE id = 1;  -- 返回100

-- 事务B：修改并提交
UPDATE users SET balance = 200 WHERE id = 1;
COMMIT;

-- 事务A：再次读取（结果不同）
SELECT balance FROM users WHERE id = 1;  -- 返回200（不可重复读）

-- READ COMMITTED是大多数数据库的默认隔离级别`
			},
			{
				point: 'REPEATABLE READ：保证同一事务中多次读取结果一致，避免不可重复读。',
				code: `-- REPEATABLE READ示例：
-- 事务A：使用REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM users WHERE id = 1;  -- 返回100

-- 事务B：修改并提交
UPDATE users SET balance = 200 WHERE id = 1;
COMMIT;

-- 事务A：再次读取（结果相同）
SELECT balance FROM users WHERE id = 1;  -- 仍然返回100（可重复读）

-- MySQL的默认隔离级别是REPEATABLE READ`
			},
			{
				point: 'SERIALIZABLE：最高隔离级别，完全串行化执行，避免所有并发问题但性能最差。',
				code: `-- SERIALIZABLE：完全串行化
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
SELECT * FROM users WHERE id = 1;
-- 其他事务不能修改或插入相关数据

-- 特点：
-- - 完全避免脏读、不可重复读、幻读
-- - 性能最差，并发度最低
-- - 通常只在特殊场景使用`
			}
		]
	}
];

